home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / select / select.c next >
Text File  |  1991-10-18  |  3KB  |  130 lines

  1.  
  2. /* SELECT  Ver1.2 */
  3. /*  Programmed by Yasu.Hara.  */
  4.  
  5. /* ヘッダ取り込み */
  6. #include    <stdio.h>
  7. #include    <stdlib.h>
  8. #include    <egb.h>
  9. #include    <mos.h>
  10. #include    <snd.h>
  11. #include    <fmc.h>
  12. #include    <ctype.h>
  13. #include    <string.h>
  14.  
  15. /* 各値の定義 */
  16. #define        ARGMAX    20        /* メニューの最大数 */
  17. #define        LENMAX    79        /* メニューの文字列の最大長さ */
  18. #define        DOT        24        /* ボックスの縦方向ドット数 */
  19. #define        CHR        '_'        /* スペースに置き換える文字 */
  20. #define        COLOR1    1        /* カーソルが指してないボックスの色 */
  21. #define        COLOR2    2        /* カーソルが指しているボックスの色 */
  22. #define        iskanji(c)    (0x81<=c && c<=0x9f || 0xe0<=c && c<=0xfc)
  23.                             /* 漢字の1バイト目かどうかのチェック */
  24.  
  25. /* 各種シンボル */
  26. int        x=20, y[ARGMAX], l[ARGMAX];
  27. char    menu[ARGMAX][LENMAX+1];
  28. char    work[1536], mwork[4096], para[128];
  29.  
  30. /* ボックスを描く */
  31. void    box_write(num, col)
  32. int        num, col;
  33. {
  34.     EGB_writePage(work, 1);
  35.     EGB_color(work, 2, col);
  36.     WORD(para+4)=(WORD(para+0)=320-x*4)+x*8-1;
  37.     WORD(para+6)=(WORD(para+2)=y[num])+DOT-1;
  38.     EGB_rectangle(work, para);
  39.     EGB_writePage(work, 0);
  40. }
  41.  
  42. /* メインルーチン */
  43. int        main(argc, argv)
  44. int        argc;
  45. char    *argv[];
  46. {
  47.     char    *p;
  48.     int        i, j, n, mx, my;
  49.     FILE    *fp;
  50.  
  51.     switch (--argc) {
  52.         case 0:        /* パラメータがないよ~ */
  53.             return 0;
  54.         case 1:        /* パラメータが1つだけ */
  55.             if ((fp=fopen(argv[1], "rt"))==NULL) return 0;
  56.             for (i=0; i<ARGMAX; i++) {
  57.                 if (fgets(p=&menu[i][0], LENMAX+1, fp)==NULL) break;
  58.                 if ((p=strchr(p, '\n'))!=NULL)
  59.                     *p='\0';
  60.                 else
  61.                     while ((j=fgetc(fp))!='\n' && j!=EOF) ;
  62.             }
  63.             argc=i;
  64.             fclose(fp);
  65.             break;
  66.         default:    /* パラメータが2つ以上 */
  67.             argc=_min(argc, ARGMAX);
  68.             for (i=0; i<argc; i++) {
  69.                 strncpy(p=&menu[i][0], *++argv, LENMAX);
  70.                 p[LENMAX]='\0';
  71.                 while (*p!='\0') {
  72.                     if (*p==CHR) *p=' ';
  73.                     j=*p++;
  74.                     if (iskanji(j) && *p++=='\0') break;
  75.                 }
  76.             }
  77.     }
  78.     y[0]=(j=(480-argc*DOT)/(argc+3))*2;
  79.     for (i=1; i<argc; i++)
  80.         y[i]=y[i-1]+j+DOT;
  81.     for (i=0; i<argc; i++)
  82.         x=_max(x, l[i]=strlen(&menu[i][0]));
  83.     x=_min(x+8, 80);
  84.  
  85.     EGB_init(work, sizeof(work));
  86.     EGB_resolution(work, 0, 3);
  87.     EGB_resolution(work, 1, 3);
  88.     EGB_displayPage(work, 0, 0);
  89.     EGB_paintMode(work, 0x22);
  90.  
  91.     for (i=0; i<argc; i++) {
  92.         box_write(i, COLOR1);
  93.         WORD(para+2)+=DOT/2+7;
  94.         WORD(para+0)=320-(WORD(para+4)=j=l[i])*4;
  95.         _move(&menu[i][0], ¶[6], j);
  96.         EGB_sjisString(work, para);
  97.     }
  98.  
  99.     EGB_displayPage(work, 0, 3);
  100.  
  101.     _fill_char(mwork, sizeof(mwork), 0);
  102.     MOS_start(mwork, sizeof(mwork));
  103.     SND_elevol_init();
  104.     SND_elevol_set(1, 127, 127);
  105.     MOS_resolution(0, 3);
  106.     MOS_horizon(0, 639);
  107.     MOS_vertical(0, 479);
  108.     MOS_setpos(319,239);
  109.     MOS_disp(1);
  110.  
  111.     n=argc;
  112.     do {
  113.         MOS_rdpos(&j, &mx, &my);
  114.         i=argc;
  115.         if ((mx=mx-320+x*4)>=0 && mx<x*8)
  116.             for (i=0; i<argc; i++)
  117.                 if ((mx=my-y[i])>=0 && mx<DOT) break;
  118.         if (i!=n) {
  119.             MOS_disp(0);
  120.             if (n<argc) box_write(n, COLOR1);
  121.             n=i;
  122.             if (n<argc) box_write(n, COLOR2);
  123.             MOS_disp(1);
  124.         }
  125.     } while (j==0 || n>=argc);
  126.     MOS_end();
  127.     EGB_init(work, sizeof(work));
  128.     return n+1;
  129. }
  130.